package com.charles.video.common.core.utils;

import com.charles.video.common.core.constant.SecurityConstants;
import com.charles.video.common.core.constant.TokenConstants;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Map;

/**
 * @author Charles-H
 * 
 * Jwt工具类
 */
public class JwtUtils {

    public static String secret = TokenConstants.TOKEN_SECRET_KEY;
    
    /** 通过声明生成令牌 */
    public static String createToken(Map<String, Object> claims) {
        return Jwts.builder().setClaims(claims).signWith(SignatureAlgorithm.HS512, secret).compact();
    }
    
    /** 通过令牌获取数据 */
    public static Claims parseToken(String token) {
        return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
    }
    
    /** 通过令牌获取成员标识 */
    public static String getMemberKey(String token) {
        Claims claims = parseToken(token);
        return getValue(claims, SecurityConstants.MEMBER_KEY);
    }
    
    /** 通过声明获取成员标识 */
    public static String getMemberKey(Claims claims) {
        return getValue(claims, SecurityConstants.MEMBER_KEY);
    }
    
    /** 通过令牌获取成员id */
    public static Integer getMemberId(String token) {
        Claims claims = parseToken(token);
        return Integer.parseInt(getValue(claims, SecurityConstants.MEMBER_ID));
    }

    /** 通过声明获取成员id */
    public static Integer getMemberId(Claims claims) {
        return Integer.parseInt(getValue(claims, SecurityConstants.MEMBER_ID));
    }
    
    /** 通过令牌获取成员工号 */
    public static String getMemberNum(String token) {
        Claims claims = parseToken(token);
        return getValue(claims, SecurityConstants.MEMBER_NUM);
    }
    
    /** 通过声明获取成员工号 */
    public static String getMemberNum(Claims claims) {
        return getValue(claims, SecurityConstants.MEMBER_NUM);
    }

    /** 通过令牌获取成员权限*/
    public static String getMemberRole(String token) {
        Claims claims = parseToken(token);
        return getValue(claims, SecurityConstants.MEMBER_ROLE);
    }
    
    /** 通过声明获取成员权限 */
    public static String getMemberRole(Claims claims) {
        return getValue(claims, SecurityConstants.MEMBER_ROLE);
    }
    
    /** 根据声明和绑定的key来获取信息 */
    public static String getValue(Claims claims, String key) {
        return Convert.toStr(claims.get(key), "");
    }
}
